//class Solution {
//    public String reverseStr(String s, int k) {
//        byte[] bytes = s.getBytes();
//
//        int i = bytes.length / k + 1;
//        int j = 0;
//        int left,right;
//
//        if(k >= bytes.length){
//            left = 0;
//            right = bytes.length -1;
//
//            while (left < right){
//                byte temp = bytes[left];
//                bytes[left] = bytes[right];
//                bytes[right] = temp;
//                left++;
//                right--;
//            }
//            return new String(bytes);
//        }
//
//        for (j = 0; (k - 1) + j * k < bytes.length; j++){
//            if(j % 2 == 0){
//                left = j*k;
//                right = (k - 1) + j * k;
//
//                while (left < right){
//                    byte temp = bytes[left];
//                    bytes[left] = bytes[right];
//                    bytes[right] = temp;
//                    left++;
//                    right--;
//                }
//            }
//        }
//
//        if(j % 2 == 0 && j*k < bytes.length){
//            left = j*k;
//            right = bytes.length -1;
//
//            while (left < right){
//                byte temp = bytes[left];
//                bytes[left] = bytes[right];
//                bytes[right] = temp;
//                left++;
//                right--;
//            }
//        }
//
//        return new String(bytes);
//    }
//}





////解法一
//class Solution {
//    public String reverseStr(String s, int k) {
//        StringBuffer res = new StringBuffer();
//        int length = s.length();
//        int start = 0;
//        while (start < length) {
//            // 找到k处和2k处
//            StringBuffer temp = new StringBuffer();
//            // 与length进行判断，如果大于length了，那就将其置为length
//            int firstK = (start + k > length) ? length : start + k;
//            int secondK = (start + (2 * k) > length) ? length : start + (2 * k);
//
//            //无论start所处位置，至少会反转一次
//            temp.append(s.substring(start, firstK));
//            res.append(temp.reverse());
//
//            // 如果firstK到secondK之间有元素，这些元素直接放入res里即可。
//            if (firstK < secondK) { //此时剩余长度一定大于k。
//                res.append(s.substring(firstK, secondK));
//            }
//            start += (2 * k);
//        }
//        return res.toString();
//    }
//}

//解法二（似乎更容易理解点）
//题目的意思其实概括为 每隔2k个反转前k个，尾数不够k个时候全部反转
class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0; i < ch.length; i += 2 * k){
            int start = i;
            //这里是判断尾数够不够k个来取决end指针的位置
            int end = Math.min(ch.length - 1, start + k - 1);
            //用异或运算反转
            while(start < end){
                ch[start] ^= ch[end];
                ch[end] ^= ch[start];
                ch[start] ^= ch[end];
                start++;
                end--;
            }
        }
        return new String(ch);
    }
}